package http_proxy_middleware

import (
	"fmt"
	"gitee.com/zhoulvvv/my_go_gateway/dao"
	"gitee.com/zhoulvvv/my_go_gateway/middleware"
	"gitee.com/zhoulvvv/my_go_gateway/public"
	"github.com/gin-gonic/gin"
	"github.com/pkg/errors"
	"log"
)

// HTTP 租户流量统计
func HTTPJwtFlowCountModeMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 获取租户信息
		appInterface, ok := c.Get("app")
		if !ok {
			c.Next()
			return
		}
		app := appInterface.(*dao.App)
		// 统计项： 1 全站 2 服务 3 租户
		// 租户统计器
		appCounter, err := public.FlowCounterHandler.GetCounter(public.FlowAppPrefix + app.AppId)
		if err != nil {
			middleware.ResponseError(c, 7001, errors.New("获取服务统计器失败："+err.Error()))
			c.Abort()
			return
		}
		appCounter.Increase()
		log.Printf("租户统计 qps:%v dayCount:%v", appCounter.QPS, appCounter.TotalCount)
		// 判断租户的日请求量是否超标
		if app.Qpd > 0 && appCounter.TotalCount > int64(app.Qpd) {
			middleware.ResponseError(c, 7001, errors.New(fmt.Sprintf("该接口当天请求已经达到限流，限流数量：%v，已经请求的数量：%v",
				app.Qpd, appCounter.TotalCount)))
			c.Abort()
			return
		}
		c.Next()
	}
}
